import numpy as np
import pandas as pd
'''
以下几种数据尤其适合用pandas进行处理：
    多种数据混合的扁平化数据格式，比如 SQL 表和 Excel 电子表格；
    时间序列数据，不管有序无序；
    任意带有行列标签的矩阵数据，不管是同种数据类型还是多种数据类型；
    还有其他任意的统计数据集，不必带标签。
'''
# todo 主要数据类型
'''
Series 实际上是一个带标签的一维数组，数组中的内容可以是任何数据类型。在 Series 中，“带标签的轴”统称为“index（索引）”，类似于我们之前学习的字典数据类型中的“key（关键字）”。
s = pd.Series(data, index=index)
data要求是下列数据类型之一：

Python 字典；
Python 列表；
N 维数组；
标量（即一个数字）。
参数index则应当是一个用来指定轴标签的列表
按照原始数据类型的不同，创建 Series 的方式也分为 4 种：1）用 Python 字典创建；2）用 Python 列表创建；3）用 N 维数组创建；4）用标量创建
'''
# 1.字典
# d = {'b': 1, 'a': 0, 'c': 2}
# s = pd.Series(d)
# print(s)
# 2.列表 在只使用列表而不提供索引值时，pandas会自动为 Series 中的数据分配默认索引作为标签
# l = [1,2,3]
# s = pd.Series(l)
# print(s)
# 3.N维数组
# ar = np.random.randn(5)
# # print(ar)
# s = pd.Series(ar, index=['a', 'b', 'c', 'd', 'e'])
# print(s)
# 4.标量
# 标量生成单元素序列
# s = pd.Series(5.)
# print(s)
# 标量生成多元素序列
# s = pd.Series(5., index=['a', 'b', 'c', 'd', 'e'])
# print(s)

# 索引 Series
# 序号进行索引
s = pd.Series([5,-4,7,-8,9], index=['a','b','c','d','e'])
# print(s[[1,2]])
# print(s)
# 标签进行索引
# print(s[['a','d']])
# print(s['a'])
# 切片功能
# print(s['a':'c'])
# pandas的if-then方言
# print(s[s > 0])
# 创建副本并赋值
# s2 = s # 直接赋值不会创建副本
# print(s2 is s)
# s2 = s.copy()
# print(s2 is s)

# Series 的运算 有自动对齐的特性,自动用默认的缺省值补全缺失的部分，以使运算顺利进行
# print(s + s)
# print(s * 2)
# print(np.exp(s))
# print(s[1:] + s[:-1])

# todo DataFrame
'''
DataFrame 是一种二维带标签的数据结构，并且允许各列直接数据类型不同。我们既可以把它当做是电子表格或是 SQL 表，
也可以将其当作是一个由若干个 Series 对象组成的字典；也是pandas中最常用的数据结构。
pd.Series(data, index=index, columns=columns)

由一维数组、列表、字典或是 Series 构成的字典；
二维 Numpy 数组；
结构化数组；
一个 Series；
别的 DataFrame。
参数index对应于 DataFrame 中的行标签，参数columns对应于DataFrame 中的列标签。通过指定这两个参数，可以有筛选使用哪些数据来生成 DataFrame
'''
# 使用由 Series 组成的字典或由字典组成的的字典来创建 DataFrame
# d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
# df = pd.DataFrame(d, index=['d', 'b', 'a'])
# df = pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])
# 默认形式
# df = pd.DataFrame(d)
# print(df)

# 使用 N 维数组或列表的字典
# d = {'one': [1., 2., 3., 4.],'two': [4., 3., 2., 1.]}
# df = pd.DataFrame(d)
# df = pd.DataFrame(d, index=['a', 'b', 'c', 'd'])
# print(df)

# 使用字典组成的列表
# data2 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
# df = pd.DataFrame(data2)
# df = pd.DataFrame(data2, index=['first', 'second'])
# df = pd.DataFrame(data2, columns=['a', 'b'])
# print(df)

# 索引 DataFrame 通过index和columns两个属性可以分别查看 DataFrame 的行标签和列标签
# d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
# df = pd.DataFrame(d)
# print(df)
# print(df.index)
# print(df.columns)
# 使用列标签来索引
# print(df['one'])
# 列标签作为属性
# print(df.one)
# 按列选取
# print(df[['one', 'two']])
# 要对 DataFrame 按行索引，则需要使用loc这个属性
# print(df.loc['a'])
# 通过行标签来按行切片、选取
# print(df.loc['a':'c'])
# print(df.loc[['a','d']])
# 使用head和tail来分别获取数据的前、后几行，具体数目由参数指定
# print(df.head(2))
# print(df.tail(2))


# 统计信息 使用describe可以计算得到一个 DataFrame 数据的相关统计信息，并且计算统计信息时会自动忽略缺省值NaN。
'''
其中count是各列的数据个数，mean是各列数据的平均值，std则对应标准差，后续的各行为从最小值到最大值的均匀数据。
'''
# print(df.describe())
# 使用median方法主动求出平均值 describe行名函数都可以使用 max one two....
# print(df.median())

# todo 其他
# d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
# Series 和 DataFrame 都可以使用同样的方法转换为numpy数组的形式：
# print(s.to_numpy())
# 两种主要数据结构还有一个叫做apply的方法，用来对实例调用指定的函数。可以指定已有的函数，也可以临时定义一个匿名函数，后者更加常见一些
# df = pd.DataFrame(d)
# print(df.apply(len))
# print(df.apply(lambda x: x * x))

# todo 读取数据
'''
pandas提供了大量函数用于文件读写，适用于 CSV、Excel、HDF、SQL、JSON、HTML 等文件类型，还包括一个读取系统剪贴板的接口pd.read_clipboard()
'''
# california_housing_dataframe = pd.read_csv("csv文件路径", sep=",")

# todo pandas 画图
import matplotlib.pyplot as plt
np.random.seed(123456)
# 一个简单的随机漫步图
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2018', periods=1000))
ts.cumsum().plot()
# DataFrame 每列的一个简单的随机漫步图
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD'))
df.cumsum().plot()
# 用关键字 x , y
df3 = pd.DataFrame(np.random.randn(1000, 2), columns=['B', 'C']).cumsum()
df3['A'] = pd.Series(list(range(len(df))))
df3.plot(x='A', y='B')
plt.show()
# 参考：https://blog.csdn.net/genome_denovo/article/details/78322628
